/**
 * 文件名称: write_log.h
 * 摘    要: linux应用程序下记录日志头文件
 * 来    源: 参考: https://blog.csdn.net/qq_39436605/article/details/81181061
 *
 * 当前版本: 1.0
 * 作    者: huenrong
 * 完成日期: 2019年06月20日
 **/

#ifndef __WRITE_LOG_H
#define __WRITE_LOG_H

// 可修改宏定义
#define ELOG_COLOR_ENABLE      // 使能终端日志颜色
#define LOG_LEVEL 3            // 控制输出日志等级
#define WRITE_LOG_FLAG 0       // 写日志标志位, 1: 在日志信息中显示"文件名/函数名/代码行数"信息
#define LOG_FILE_MAX_LINE 5000 // 日志文件最大行数
// 日志文件名前缀(在后面加上创建日期，最大长度不超过23)
#define LOG_FILE_NAME_PREFIX "log"
// 日志文件路径前缀(末尾不要有/)，会在此路径下创建日期文件夹(最大长度不超过50)
// #define LOG_FILE_PATH "/root/voltage_control/log"
#define LOG_FILE_PATH "/var/log/voltage_control"


// 日志级别定义
#define LOG_ERROR 0 // 错误
#define LOG_WARN 1  // 警告
#define LOG_INFO 2  // 信息
#define LOG_DEBUG 3 // 调试

#ifdef ELOG_COLOR_ENABLE
// 终端颜色控制起始和结束符
#define CSI_START "\033["
#define CSI_END "\033[0m"
// 输出日志字体颜色
#define F_BLACK "30;"
#define F_RED "31;"
#define F_GREEN "32;"
#define F_YELLOW "33;"
#define F_BLUE "34;"
#define F_MAGENTA "35;"
#define F_CYAN "36;"
#define F_WHITE "37;"
// 输出日志背景色
#define B_NULL ""
#define B_BLACK "40;"
#define B_RED "41;"
#define B_GREEN "42;"
#define B_YELLOW "43;"
#define B_BLUE "44;"
#define B_MAGENTA "45;"
#define B_CYAN "46;"
#define B_WHITE "47;"
// 输出日志字体格式
#define S_BOLD "1m"
#define S_UNDERLINE "4m"
#define S_BLINK "5m"
#define S_NORMAL "22m"

#endif /* ELOG_COLOR_ENABLE */

// 函数宏定义
#define printf_log_error(fmt, ...) __printf_log_error(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define printf_log_warn(fmt, ...) __printf_log_warn(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define printf_log_info(fmt, ...) __printf_log_info(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define printf_log_debug(fmt, ...) __printf_log_debug(__FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__)
#define printf_log(level, fmt, ...) __printf_log(__FILE__, __FUNCTION__, __LINE__, level, fmt, ##__VA_ARGS__)
#define write_log_file(level, fmt, ...) __write_log_file(__FILE__, __FUNCTION__, __LINE__, level, fmt, ##__VA_ARGS__)

/************************************************************************
函数名称: __printf_log_error
函数功能: 打印错误日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_error(const char *file_name, const char *function_name,
                        const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log_warn
函数功能: 打印警告日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_warn(const char *file_name, const char *function_name,
                       const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log_info
函数功能: 打印信息日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_info(const char *file_name, const char *function_name,
                       const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log_debug
函数功能: 打印调试日志(打印代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log_debug(const char *file_name, const char *function_name,
                        const unsigned int code_line, const char *fmt, ...);

/************************************************************************
函数名称: __printf_log
函数功能: 打印日志(打印代码文件名、函数名、代码所在行)
函数参数: log_level: 需要打印的日志等级
          file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          fmt: 要打印内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __printf_log(const char *file_name, const char *function_name, const unsigned int code_line,
                  const unsigned char log_level, const char *fmt, ...);

/************************************************************************
函数名称: __write_log_file
函数功能: 将内容写到日志文件中(记录代码文件名、函数名、代码所在行)
函数参数: file_name: 代码文件名
          function_name: 代码所在函数名
          code_line: 代码行
          log_level: 日志等级
          fmt: 要写入内容的指针
          ...: 其他参数
函数返回: 无
************************************************************************/
void __write_log_file(const char *file_name, const char *function_name, const unsigned int code_line,
                      const unsigned char log_level, const char *fmt, ...);

#endif /* __WRITE_LOG_H */
